package com.example.springboot.config.intercepter;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @desc 自定义拦截器，使用 @Component 让 Spring 管理其生命周期
 * 第一种：
 * 1、实现HandlerInterceptor接口
 * 2、实现器方法
 * 3、编写一个配置类继承WebMvcConfigurerAdapter，实现addInterceptors（）方法
 * 4、在配置类中注入自定义拦截器，并将将拦截器加入到拦截器链中
 * @Author wangsh
 * @date 2018/5/6 17:06
 * @return
 */
@Component
public class TestIntercepter implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		System.out.println(">>>preHandle>>>>>>>在请求处理之前进行调用（Controller方法调用之前）");
		setCrossDomain(response);
		return true;// 只有返回true才会继续向下执行，返回false取消当前请求
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
		// 请求处理之后进行调用，但是在视图被渲染之前（Controller方法调用之后）;
		System.out.println(">>>postHandle>>>>>>>请求处理之后进行调用，但是在视图被渲染之前（Controller方法调用之后）");
	}

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
		// 在整个请求结束之后被调用，也就是在DispatcherServlet 渲染了对应的视图之后执行（主要是用于进行资源清理工作）;
		System.out.println(">>>postHandle>>>>>>>在整个请求结束之后被调用，也就是在DispatcherServlet 渲染了对应的视图之后执行（主要是用于进行资源清理工作）");
	}

	/**
	 * @param @param response    设定文件
	 * @return void    返回类型
	 * @throws
	 * @Title: setCrossDomain
	 * @Description: TODO(设置跨域问题)
	 */
	private void setCrossDomain(HttpServletResponse response) {
		response.addHeader("Access-Control-Allow-Origin", "*");
		response.addHeader("Access-Control-Allow-Methods", "POST,GET");
		response.addHeader("Access-Control-Allow-Credentials", "true");
	}
}

